// poj2155
// 题意：给顶一个n*n(n<=1000)的0, 1矩阵，每次可以对一个给定子矩形区域
//       内0, 1反置，或者询问一个位置是0还是1。询问有T(<=50000)次。
//
// 题解：二维树状数组可以搞定。二维树状数组不难，每一维都是树状数组的
//       组织方式，从原来的一重循环变成两重循环，每个操作推广类似。
//
// run: $exec < input
// opt: 0
// flag: -g
#include <iostream>
#include <cstring>

int const maxn = 1002;

int tree[maxn][maxn];
int n, m;

int lowbit(int x) { return x & -x; }

void update(int x, int y, int d)
{
	for (int ty = y; x <= n; x += lowbit(x), y = ty)
		for (; y <= n; y += lowbit(y)) tree[x][y] += d;
}

int sum(int x, int y)
{
	int ret = 0;
	for (int ty = y; x > 0; x -= lowbit(x), y = ty)
		for (; y > 0; y -= lowbit(y)) ret += tree[x][y];
	return ret;
}

int main()
{
	std::ios::sync_with_stdio(false);
	int T; std::cin >> T;
	for (int ti = 0; ti < T; ti++) {
		if (ti) std::cout << '\n';
		std::cin >> n >> m;
		std::memset(tree, 0, sizeof(tree));
		for (int i = 0; i < m; i++) {
			char ch; std::cin >> ch;
			if (ch == 'C') {
				int x1, y1, x2, y2;
				std::cin >> x1 >> y1 >> x2 >> y2;
				update(x1, y1, 1);
				update(x1, y2 + 1, 1);
				update(x2 + 1, y1, 1);
				update(x2 + 1, y2 + 1, 1);
			} else {
				int x, y; std::cin >> x >> y;
				std::cout << (sum(x, y) & 1) << '\n';
			}
		}
	}
}

